加州伯克利大学计算机系是如何培养计算机人才的?
The following article is from 珂学原理 Author 刘雪峰
本文转自微信号“珂学原理”
最近花了一点时间研究加利福尼亚大学伯克利分校(University of California, Berkeley,简称UCB)计算机专业的课程设置,感触颇深。
UCB在计算机科学领域的杰出表现可以在各大主流计算机专业排名中得以体现。
全美大学范围内,UCB在US News 2019计算机科学排名中与麻省理工大学(MIT)、斯坦福大学(Stanford)、卡内基梅隆大学(CMU)三所顶尖大学并列第一名。
UCB的计算机科学是一个人才辈出的专业,其著名毕业生包括:
• Eric Schmitt(Google前CEO)• Steve Wozniak(Apple公司创始人)• Bill Joy(Sun Microsystems创始人,BSD作者之一)
同时,UCB每年都会评选几个杰岀校友,有意思的是,Andrew Ng(吴恩达,华裔美国人,人工智能和机器学习领域国际上最权威的学者之一,2014年-2017年曾担任百度首席科学家)刚被评为2019年UCB杰出校友。
我找到了近几年杰出校友的名单:
① UCB计算机专业的杰出校友
从上述名单中可以看到,UCB的校友除了在高校任教外,很多都是一些科技公司的创始人和技术主管。
此外,UCB计算机科学专业的现任教授们也是大名鼎鼎,其中包括六位图灵奖得主。
那么,为什么UCB诞生了这么多牛人?
除了本身名气大、生源好以外,我认为,这与它的培养体系有不可或缺的关系。
我们先看看UCB计算机专业的一些特点。
一个学院,两个体系
出人意料的是,尽管UCB的计算机专业非常有名,但它竟然没有单独的计算机系。
在UCB,计算机系和电子工程系合在一起,叫电气工程与计算机科学系(Department of Electrical Engineering & Computer Sciences),简称:EECS。
② UCB的电气工程与计算机科学系
为什么CS(Computer Science)会和EE(Electrical Engineering)在一起呢?EECS主页上是这么解释的:
• 电气工程师和计算机科学家他们都是是同一群人,他们负责设计系统和模块,用来釆集、存储、处理、解释以及传递信息或者信号。
• 此外,在20世纪,世界上最重要的工程突破,都是由电气工程师或者计算机科学家发明或实施的,其中包括电力系统、全球广播和个人电信系统、计算机网络、医疗仪器、集成电路、激光、家用电器和反馈控制等。
• 此外,电子工程师和计算机科学家开发的新技术在21世纪可能更加重要,因为,更快的通信速率、更小的设备、更强大的计算能力使智能、信息驱动系统(intelligent, information-driven systems)的新时代成为可能。
EECS不仅在学院名称上体现了学科交叉的特点,在课程培养上也有体现。
一个学院,两种培养体系
从本科来看,EECS可以用“一个学院,两种培养体系(One Department, Two Programs)”来简单概括。
这两个培养体系的最终结果是两种证书:
• 一个是工程学院(the College of Engineering)授予的理学硕士(the Bachelor of Science in EECS),
• 另外一个是文理学院(the College of Letters&Science)授予的计算机科学文学学士(the Bachelor of Arts in CS)。
这两个不同的培养体系在计算机科学的内容上没有什么不同,其主要差别在于计算机科学之外的课程上。EECS主页上介绍,
“如果你兴趣更广泛,对经济,统计,商业和音乐等也很感兴趣,或者想读一个双学位,你应该选择后者。
而如果你对工程专业更感兴趣,那么前者应该更适合你”。
简单的说,前者在工程方面更深入,后者则让学生有更大的灵活性来探索工程之外的领域。
为未来而教的培养目标
EECS在它的主页上说:
多数UCB的EECS学生在毕业后,会在工业界开展自己的职业生涯。
计算机科学学士学位将使你为各种有趣的工作做好准备,包括软件工程、网络开发、数据分析和咨询。
部分学生毕业后,会在高校或者公司的研究部门从事研究工作。
我们的目标是让学生毕业的时候为他们做好准备,不管是在工业界从事技术领导工作(technical leadership in industry),还是在高校从事研究工作。
因此,我们必须具有前瞻性,要超越当前的技术(look beyond today's technology),给学生们提供一些关于计算机行业的一些大的理念(big ideas),培养学生的学习技能,才能让他们在将来具备自我学习、不断提高的能力。
层次分明,以点带面的课程体系
UCB CS专业课的课程体系将课程分为lower division和upper division两种,类似国内的专业必修课和专业选修课。此外,课程体系中每一门课都有一些先修课,整个形成一个知识树(见图③)。
图③显示了课程中的一部分重要课程。包括红色的核心课程(core),蓝色的软件课程(Software),黄色的硬件课程(Hardware),绿色的理论课程(Theory),以及紫色的应用课程(Applications);
有箭头指向某一个节点课程的课程,就是这门课程的先修课:
③ CS的课程体系
Lower division:只要是CS专业的就要求学,是基础和核心,包括六门课:
• Math lA(Calculus I)微积分I
• Math IB(Calculus II)微积分II
• CS 61A(Structure and Interpretation of Computer Programs, SICP),CS第一门课,讲CS的基础和核心概念(variable, control flow, loop, recursion等),使用Python语言。
• CS 61B/BL(Data Structures),CS第二门课,讲数据结构(Arrays, linked list, Tree, Hash, Stack, Queue等)和一些算法(BFS, DFS, Dijkstra, A*等),用Java语言。
• CS 61C(Machine Structures),CS第三门课,讲计算机底层的原理。用C和MIPS。
• CS 70(Discrete Mathematics and Probability Theory),CS唯一一门必修的理论课,讲离散数学(Proofs, Induction, Stable Marriage 等)和概率(Probability)。
Upper division:专业选修课,满一定学分即可毕业。
选修课可以分 为4个方向,包括软件,硬件,理论,及应用。
我选几个重要的列举出来:
• 硬件方向:只有一门,CS 152(Computer Architecture and Engineering),偏硬件和底层
• 软件方向的重要课程:CS 160(User Interface Design and Development)UI 设计;CS 161 (Computer Security)计算机安全;CS 162(Operating Systems and System Programming)操作系统;CS 164(Programming Languages and Compilers)设计程序语言和编译器等;CS 169(Software Engineering)软件工程。
• 理论方向的重要课程:CS 170(Efficient Algorithms and Intractable Problems),介绍计算机科学理论基础和算法;CS 172(Computability and Complexity)可计算性和计算复杂度;CS 174(Combinatorics and Discrete Probability)组合数学与离散概率;
• 应用方向的重要课程:CS 188(Introduction to Artificial Intelligence)人工智能入门;CS 184(Foundations of Computer Graphics)计算机图形学;CS 186(Introduction to Database Systems)数据库;CS 189(Introduction to Machine Learning)机器学习入门。
EECS的几门核心课程的确是王牌,以CS 61A(SICP)为例,该课程被彭博社评为“全美五个最佳计算机科学课程之一”。
CS61A的SICP指的是程序构造与解释,不局限于教语言本身(实际上这门课的final会同时考到Python, Scheme, SQL)等语言。
这和自学以及培训班所开设的专门针对某一个语言的课(C++, Java, Python)等是不一样的。报名该课程的人数非常多,曾出现了1600人同上一门课的盛况!(见图④)
④ 1600人同时上的一门课:CS61A
另外一门核心课程CS 61C(Machine Structures)和直接教你编程写代码不同,这门课讲计算机的底层原理,覆盖量相当之广,从汇编语言到SDS,搭建CPU,cache,包括从伯克利诞生的RAID都有所涉猎。
由此我们可以看出,UCB的CS教育以培养学生的计算机科学思维为主,编程(coding)能力为辅。
我记得之前在计算机学院开会的时候,一个老师提出了一个问题:
计算机专业的学生写的程序和非计算机专业的学生写的程序有什么区别?
我想,区别主要在这些专业核心课程上。
通过对这些专业核心课程的深刻理解,计算机专业的学生写的程序所运用到的计算机思维和相关概念(底层原理,数据结构、算法等等),都要比非专业的学生, 或者是那些经过短期培训班的学生好得多。
UCB还有一类课程,是让学生自己开课,被称为(DeCal),就是完全由学生自己组织、上课、布置任务的特殊课程(学生自己开课流程如图⑤)。
经过这么多年的发展,DeCal已经成为Berkeley课程体系的一部分,并且其课时计入总学分(一般普通课程是4学分一学期,DeCal—般为2学分),但是不参与GPA计算。
计算机的Decal通常是一些应用的课程,例如VR、游戏设计、3D建模与动画、网页开发、iOS开发、3D打印、区块链技术等。
⑤ 学生自己开课流程
最后总结一下EECS的计算机课程体系的几个特点:
1. 层次化(大部分课程需要先修课程);2. 超强的精品课;3. 培养学生的计算机科学思维为主,coding能力为辅;4. 给学生极大的自由,体现在两点:(1) 必修少,选修课多;(2) 让学生自己开课(DeCal)。
学以致用:鼓励本科生参与研究
UCB的EECS学院,鼓励本科生参与更多的研究工作。
UCB认为:
让学生参与研究工作,特别是在学校教职工的带领下参加研究工作,将加深你在特别感兴趣领域的知识和技能,同时体验从事研究的意义。
⑥ 本科生参与科研
UCB提供了多条路径积极鼓励学生参与科研。
对于本科生,UCB在网站上给出了一系列指导措施和具体方法:
1. 决定你感兴趣的研究领域;
• 阅读EECS研究页面,查看该部门的区域、实验室、中心和项目的完整列表。查看EECS研究项目以查看过去和当前的研究项目。此外,注意你比其他人更喜欢什么课程,这可能会帮助你决定你想在哪里做研究。
2. UCB每周会有一次的学术报告会(colloquia showcase research presentations);
• 教职工会展示他们的一些研究成果,同时借此机会来找到愿意参与该项目的学生。
3. UCB经常会有本科生研究海报会议(undergraduate research poster sessions);
• 本科生通过参加这个会议就可以了解到自己的同学正在参与的研究项目,从而加入某个项目中。
4. UCB的本科研究见习计划(The Undergraduate Research Apprentice Program, URAP);
• 该计划旨在使伯克利大学的本科生更深入地参与大学的研究生活,在每个学期开始时开放申请。图⑦显示了EECS学院部分供本科生参与的项目。
⑦ URAP计划中EECS学院部分供本科生参与的项目
5. 本科暑期工程研究项目(Summer Undergraduate Program, SUPERB);
• EECS会每年夏天会邀请一群不同的本科生在EECS教职员工和研究生的指导下进行为期9周的研究工作。很多参加该项目的本科生后来都获得了博士学位。
6. 为了鼓励科研,UCB规定“在本科参与研究可以获得一定的学分”,并为此专门设了两门课(EE199, CS199);
• 这两门课被称为有监管的独立研究课(Supervised Independent Study class),学生注册这门课需要一名教师主管和一名导师的批准。
7. 如果特别喜欢研究的本科生,还可以申请EECS荣誉计划(EECS Honors Program)。
• 该计划主要针对在研究上感兴趣且有才华的本科生。参加该计划的本科生会以从事研究为主,接受一名特别的导师指导。该计划的学生可选择完成荣誉论文,并在毕业的成绩单上得到关于荣誉学位(honors degree)的正式批注。但是关于申请和完成该计划,都有比较严格的管理规章。
总结
UCB计算机专业的特点及其给我的启发如下:
• UCB的EECS系是计算机科学和电气工程融合在一起的,很多课程都有交叉。
• UCB的EECS系培养学生的目的,是为了学生在能够适应和主动学习未来的世界,因此它处处都体现了让学生发挥自己的能动性的特点。它不仅设置了EECS和CS两个学位供学生挑选,还设置了大量的选修课,让学生根据自己的兴趣来选择,甚至还有让学生自己开课(DeCal)。
本文整理自刘雪峰·信息思维课,转载请获授权。
(完)
更多精彩:
北大李晓明教授:有向图的增强——一个适合以问题求解为导向教学的例子